package advanced.thread;


import java.util.concurrent.atomic.AtomicInteger;

/**
 * 锁分为两类:
 * 悲观锁: synchronized 是独占锁即悲观锁, 会导致其他所有需要所得线程挂起, 等待持有锁的线程释放锁
 * <p>
 * 乐观锁: 每次不加锁而是假设没有冲突而去完成某项操作, 如果因为冲突失败就冲是, 直到成功为止.
 * <p>
 * 乐观锁的实现:
 * <p>
 * <p>
 * CAS是一组原子操作, 不会被外部打断, 属于硬件级别的操作, 同时借助JNI 来完成的非阻塞算法
 * Atomic 开头的类都已经实现了原子性操作
 */
public class L_Atomic {
    private static AtomicInteger stock = new AtomicInteger(5);

    public static void main(String[] args) {

        for (int i = 0; i < 5; i++) {
            new Thread(() -> {
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                Integer left = stock.decrementAndGet();
                if (left < 1) {
                    System.out.println(Thread.currentThread().getName() + "没有抢到, 没有余票了");
                    return;
                }
                System.out.println(Thread.currentThread().getName() + "抢到了一件商品");
            }).start();

        }
    }

}
